<?php

/**
 * Description of ReservaServicios
 *
 * @author  Mariano Renkine
 * @author  Fernando Arau
 */
class ReservaServicios extends Servicios
{

  function validarFecha($string_fecha_hora)
  {
    
  }

  function listar()
  {
    $repo = new RepoReserva();
    $reservas = $repo->listar();
    $reservasDTO = null;
    foreach ($reservas as $reserva)
    {
      $reservasDTO[] = $this->aDTO($reserva);
    }
    return $reservasDTO;
  }

  /**
   * Busca los tratamientos Disponibles en una fecha y hora dada.
   */
  function buscarTratamientosDisponibles($fecha, $hora)
  {
    $tratamientosPosibles = array();
    $cant = 0;
    $sGabinete = new GabineteServicios();
    $stratamiento = new TratamientoServicios();
    $sTerapeuta = new TerapeutaServicios();
    $gabinetes = $sGabinete->listarNoBloqueados($fecha, $hora);    

    if ($gabinetes != false)
    {
      for ($i = 0; $i < count($gabinetes); $i++)
      {
        if ($sGabinete->validarDisponibilidad($fecha, $hora, $gabinetes[$i]->getId()))
        {
          $tratamiento = $stratamiento->buscarTratamientoPorGabinete($gabinetes[$i]->getId());
          //exit("CANT: ".count($tratamiento));

          for ($j = 0; $j < count($tratamiento); $j++)
          {
            $terapeutas = $tratamiento[$j]->getTerapeutas();
            for ($k = 0; $k < count($terapeutas); $k++)
            {
              //aca busco si el terapeuta trabaja en ese horario y si no esta atendiento otra reserva!
              $disponibilidadTerapeuta = $sTerapeuta->valiarDisponibilidadTerapeuta($terapeutas[$k]->getId(), $fecha, $hora);
              if ($disponibilidadTerapeuta)
              {
                $existe = 0;
                for ($n = 0; $n < count($tratamientosPosibles); $n++)
                {
                  if ($tratamientosPosibles[$n]->getId() == $tratamiento[$j]->getId())
                  {
                    $existe = 1;
                  }
                }
                if (!$existe)
                {
                  $tratamientosPosibles[$cant] = $tratamiento[$j];
                  $cant++;
                }
              }
            }
          }
        }
      }
    }

    return $tratamientosPosibles;
  }

  /**
   *
   * @param integer $fechaDesde (timestamp)
   * @param integer $cantDias
   * @param TratamientoDTO $tratamientoDTO
   * @return string $fechas "Y-m-d H"
   */
  function buscarFechasDisponiblesTratamiento($fechaDesde, $cantDias, TratamientoDTO $tratamientoDTO)
  {
    /**
     * Cantidad de opciones encontradas.
     */
    $cantidad = 0;
    $sGabinete = new GabineteServicios();
    $stratamiento = new TratamientoServicios();
    $sTerapeuta = new TerapeutaServicios();
    $tratamiento = $stratamiento->buscar($tratamientoDTO->getId());
    $horariosPosibles = array();
// Obtiene los gabinetes Habilitados
    $gabinetes = $sGabinete->listarNoBloqueados($fechaDesde, '');
    $cantGabinetes = count($gabinetes);
    if ($gabinetes != false)
    {
      $fechaHasta = strtotime('+' . $cantDias . 'day', $fechaDesde);

      // Recorre las fechas solicitadas (fecha Desde, cantidad de días)
      /* @var $fecha integer */
      for ($fecha = $fechaDesde; $fecha < $fechaHasta; $fecha = strtotime('+1 day', $fecha))
      {
        // Recorre todas las horas configuradas.
        for ($hora = HORA_COMIENZO; $hora < HORA_FIN; $hora++)
        {
          // Recorre los gabinetes habilitados para verificar disponibilidad en cada fecha y hora
          $contadorGabinetes = 0;
          $disponibilidadEncontrada = false;
//          for ($i = 0; $i < count($gabinetes); $i++)
          while ($contadorGabinetes < $cantGabinetes && !$disponibilidadEncontrada)
          {
            if ($sGabinete->validarDisponibilidad($fecha, $hora, $gabinetes[$contadorGabinetes]->getId()))
            {
              // Valido si el tratamiento puede realizarse en el Gabinete
              $gabineteApto = $stratamiento->validarGabinete($gabinetes[$contadorGabinetes]->getId(), $tratamientoDTO->getId());
              if ($gabineteApto)
              {
                // Obtengo los terapeutas que pueden realizar el tratamiento
                $terapeutas = $tratamiento->getTerapeutas();
                // Recorre terapeutas para validar disponbilidad
//                for ($k = 0; $k < count($terapeutas); $k++)
                $contadorTerapeutas = 0;
                while ($contadorTerapeutas < count($terapeutas) && !$disponibilidadEncontrada)
                {
                  // Busca si el terapeuta trabaja en ese horario y si está disponible
                  $disponibilidadTerapeuta = $sTerapeuta->valiarDisponibilidadTerapeuta($terapeutas[$contadorTerapeutas]->getId(), $fecha, $hora);
                  if ($disponibilidadTerapeuta)
                  {
                    $fechaDisponible = date("d/m/Y", $fecha);
                    $horariosPosibles[$cantidad]["fecha"] = $fechaDisponible;
                    $horariosPosibles[$cantidad]["hora"] = $hora;
                    $cantidad++;
                    $disponibilidadEncontrada = true;
                  }
                  $contadorTerapeutas++;
                }
              }
            }
            $contadorGabinetes++;
          }
        }
      }
    }

    return $horariosPosibles;
  }

  /**
   *
   * @param type $fecha
   * @param string $hora
   * @param type $reserva
   * @return array $tratamientosPosibles 
   */
  function buscarTratamientosDisponiblesSinReservaActual($fecha, $hora, $reserva)
  {
    $tratamientosPosibles = array();
    $cant = 0;
    $sGabinete = new GabineteServicios();
    $stratamiento = new TratamientoServicios();
    $sTerapeuta = new TerapeutaServicios();

    $gabinetes = $sGabinete->listarNoBloqueados($fecha, $hora);

    if ($gabinetes != false)
    {
      for ($i = 0; $i < count($gabinetes); $i++)
      {
        if ($sGabinete->validarDisponibilidadSinReservaActual($fecha, $hora, $gabinetes[$i]->getId(), $reserva))
        {
          $tratamiento = $stratamiento->buscarTratamientoPorGabinete($gabinetes[$i]->getId());

          for ($j = 0; $j < count($tratamiento); $j++)
          {
            $terapeutas = $tratamiento[$j]->getTerapeutas();
            for ($k = 0; $k < count($terapeutas); $k++)
            {
              //aca busco si el terapeuta trabaja en ese horario y si no esta atendiento otra reserva!
              $disponibilidadTerapeuta = $sTerapeuta->valiarDisponibilidadTerapeutaSinReservaActual($terapeutas[$k]->getId(), $fecha, $hora, $reserva);
              if ($disponibilidadTerapeuta)
              {
                $existe = 0;
                for ($n = 0; $n < count($tratamientosPosibles); $n++)
                {
                  if ($tratamientosPosibles[$n]->getId() == $tratamiento[$j]->getId())
                  {
                    $existe = 1;
                  }
                }
                if (!$existe)
                {
                  $tratamientosPosibles[$cant] = $tratamiento[$j];
                  $cant++;
                }
              }
            }
          }
        }
      }
    }

    return $tratamientosPosibles;
  }

  function buscarTerapeutasDisponibles($fecha, $hora, $idTratamiento)
  {
    $array = array();
    $cant = 0;
    $stratamiento = new TratamientoServicios();
    $sTerapeuta = new TerapeutaServicios();
    $terapeutasDisponibles = array();
    $tratamiento = $stratamiento->buscar($idTratamiento);

    $terapeutas = $tratamiento->getTerapeutas();
    for ($i = 0; $i < count($terapeutas); $i++)
    {
      //aca busco si el terapeuta trabaja en ese horario y si no esta atendiento otra reserva!
      $horariosTerapeutas = $sTerapeuta->valiarDisponibilidadTerapeuta($terapeutas[$i]->getId(), $fecha, $hora);
      if ($horariosTerapeutas != false)
      {
        $terapeutasDisponibles[$cant] = $terapeutas[$i];
        $cant++;
      }
    }
    for ($i = 0; $i < count($terapeutasDisponibles); $i++)
    {
      $array[$i]["id"] = $terapeutasDisponibles[$i]->getId();
      $array[$i]["valor"] = $terapeutasDisponibles[$i]->getNombre() . " " . $terapeutasDisponibles[$i]->getApellido();
    }

    return $array;
  }

  function buscarTerapeutasDisponiblesSinReservaActual($fecha, $hora, $idTratamiento, $reserva)
  {
    $array = array();
    $cant = 0;
    $stratamiento = new TratamientoServicios();
    $sTerapeuta = new TerapeutaServicios();
    $terapeutasDisponibles = array();
    $tratamiento = $stratamiento->buscar($idTratamiento);

    $terapeutas = $tratamiento->getTerapeutas();
    for ($i = 0; $i < count($terapeutas); $i++)
    {
      //aca busco si el terapeuta trabaja en ese horario y si no esta atendiento otra reserva!
      $horariosTerapeutas = $sTerapeuta->valiarDisponibilidadTerapeutaSinReservaActual($terapeutas[$i]->getId(), $fecha, $hora, $reserva);
      if ($horariosTerapeutas != false)
      {
        $terapeutasDisponibles[$cant] = $terapeutas[$i];
        $cant++;
      }
    }
    for ($i = 0; $i < count($terapeutasDisponibles); $i++)
    {
      $array[$i]["id"] = $terapeutasDisponibles[$i]->getId();
      $array[$i]["valor"] = $terapeutasDisponibles[$i]->getNombre() . " " . $terapeutasDisponibles[$i]->getApellido();
    }

    return $array;
  }

  /**
   *
   * @param type $fecha
   * @param type $tratamiento
   * @param type $terapeuta
   * @return array con Gabinetes disponibles 
   */
  function buscarGabinetesDisponibles($fecha, $hora, $tratamiento)
  {
    $array = array();
    $gabinetesDisponibles = array();
    $cant = 0;
    $sGabinete = new GabineteServicios();
    $sTratamiento = new TratamientoServicios();
    $tratamientoO = $sTratamiento->buscar($tratamiento);
    $gabinetes = $tratamientoO->getGabinetes();
    if ($gabinetes != false)
    {
      for ($i = 0; $i < count($gabinetes); $i++)
      {
        if (!$sGabinete->estaBloqueado($fecha, $hora, $gabinetes[$i]->getId()) && $sGabinete->validarDisponibilidad($fecha, $hora, $gabinetes[$i]->getId()))
        {
          $gabinetesDisponibles[$cant] = $gabinetes[$i];
          $cant++;
        }
      }
      for ($i = 0; $i < count($gabinetesDisponibles); $i++)
      {
        $array[$i]["id"] = $gabinetesDisponibles[$i]->getId();
        $array[$i]["valor"] = $gabinetesDisponibles[$i]->getNombre();
      }
    }
    return $array;
  }

  /**
   *
   * @param type $fecha
   * @param type $tratamiento
   * @param type $terapeuta
   * @param type $reserva
   * @return array con Gabinetes disponibles 
   */
  function buscarGabinetesDisponiblesSinReservaActual($fecha, $hora, $tratamiento, $reserva)
  {
    $array = array();
    $gabinetesDisponibles = array();
    $cant = 0;
    $sGabinete = new GabineteServicios();
    $sTratamiento = new TratamientoServicios();
    $tratamientoO = $sTratamiento->buscar($tratamiento);
    $gabinetes = $tratamientoO->getGabinetes();
    if ($gabinetes != false)
    {
      for ($i = 0; $i < count($gabinetes); $i++)
      {
        if ($sGabinete->validarDisponibilidadSinReservaActual($fecha, $hora, $gabinetes[$i]->getId(), $reserva))
        {
          $gabinetesDisponibles[$cant] = $gabinetes[$i];
          $cant++;
        }
      }
      for ($i = 0; $i < count($gabinetesDisponibles); $i++)
      {
        $array[$i]["id"] = $gabinetesDisponibles[$i]->getId();
        $array[$i]["valor"] = $gabinetesDisponibles[$i]->getNombre();
      }
    }
    return $array;
  }

  function buscarTerapeutaGab($tratamiento_seleccionadoDTO)
  {
    
  }

  function agregar($reservaDto)
  {
    $repoReserva = new RepoReserva();
    return $repoReserva->agregar($this->deDTO($reservaDto));
  }

  function buscarReserva(BusquedaReservaDTO $busquedaReservaDTO)
  {
    $repoReserva = new RepoReserva();
    $reservasDTO = null;
//        $busquedaReservaDTO->
    $repoReserva->buscarReserva($busquedaReservaDto);
  }

  function buscar($id)
  {
    $repo = new RepoReserva();
    $reserva = $repo->buscar($id);
    return $this->aDTO($reserva);
  }

  function modificar($reservaDto)
  {
    $repoReserva = new RepoReserva();
    return $repoReserva->modificar($this->deDTO($reservaDto));
  }

  function buscarPorGabineteFecha($gabinete, $fecha, $hora)
  {
    $repoReserva = new RepoReserva();
    $sGabinete = new GabineteServicios();
    $sTratamiento = new TratamientoServicios();
    $sTerapeuta = new TerapeutaServicios();

    $reservas = $repoReserva->buscarPorGabineteFecha($gabinete, $fecha, $hora);
    $reservasDTO = null;
    if ($reservas == true)
    {
      $reservasDTO[] = $this->aDTO($reservas);
    }
    return $reservasDTO;
  }

  function buscarPorComprobante(Comprobante $comprobante)
  {
    $repoReserva = new RepoReserva();
    $reserva = $repoReserva->buscarPorComprobante($comprobante);

    return ($reserva) ? $this->aDTO($reserva) : false;
  }

  function crearComprobante($idReserva)
  {
    $comprobanteServicios = new ComprobanteServicios();
    $productosServicios = new ProductoServicios();
    $tratamientoServicios = new TratamientoServicios();

    $total = 0;
    $array_detalles = array();
    $comprobante = new Comprobante();
    $comprobante->setFechaHora(date("Y-m-d"));
    $comprobante->setIdReserva($idReserva);
    $reserva = $this->buscar($idReserva);    
    $productos = $productosServicios->buscarPorTratamiento($reserva->getTratamiento());
    $detalleTratamiento = new DetalleComprobante();
    $detalleTratamiento->setNroItem(1);
    $detalleTratamiento->setCantidad(1);
    $detalleTratamiento->setDescuento(0);
    $detalleTratamiento->setProducto(0);
    $detalleTratamiento->setPrecioUnitario($reserva->getTratamiento()->getPrecio());
    $detalleTratamiento->setDescripcion($reserva->getTratamiento()->getNombre());
    $total += $reserva->getTratamiento()->getPrecio();
    $array_detalles[0] = $detalleTratamiento;

    for ($i = 1; $i <= count($productos); $i++)
    {
      $detalle = new DetalleComprobante();
      $detalle->setNroItem($i + 1);
      $detalle->setCantidad(1);
      $detalle->setDescuento(0);
      $detalle->setProducto($productos[$i - 1]);
      $detalle->setDescripcion($productos[$i - 1]->getDescripcion());
      $detalle->setPrecioUnitario($productos[$i - 1]->getPrecio());
      $total += $productos[$i - 1]->getPrecio();
      $array_detalles[$i] = $detalle;
    }

    $comprobante->setDetalleComprobante($array_detalles);
    $comprobante->setTotalComprobante($total);

    return $comprobanteServicios->agregar($comprobante);
  }

  function cancelar(ReservaDTO $reservaDTO)
  {
    $repoReserva = new RepoReserva();
    return $repoReserva->cancelar($reservaDTO->getId());
  }

  /**
   * Si encuentra reservas para el terapeuta en la fecha indicada devuelve un array asociativo con los ids de las reservas y las horas como indices ,
   * si no encuentra ninguna devuelve false.
   * @param type $terapeuta idTerapeuta
   * @param type $fecha sólo fecha (sin hora)
   * @return array 
   * @return bool
   */
  function buscarReservasTerapeuta(HorarioDTO $horarioDTO)
  {
    $repoReserva = new RepoReserva();
    $horarioServicios = new HorarioServicios();
    return $repoReserva->buscarReservasTerapeuta($horarioServicios->deDTO($horarioDTO));
  }

  function aDTO(Reserva $reserva)
  {
    $reservaDTO = new ReservaDTO();
    $reservaDTO->setId($reserva->getId());
    $reservaDTO->setFecha($reserva->getFechaReserva());
    $reservaDTO->setGabinete($reserva->getGabinete());
    $reservaDTO->setHabitacion($reserva->getHabitacion());
    if ($reserva->getCliente() != NULL)
    {
      $clienteServicios = new ClienteEventualServicios();
      $clienteDTO = $clienteServicios->aDTO($reserva->getCliente());
      $reservaDTO->setCliente($clienteDTO);
    } else
    {
      $reservaDTO->setHabitacion($reserva->getHabitacion());
      $reservaDTO->setNombreHuesped($reserva->getNombreHuesped());
      $reservaDTO->setNumeroReservaPMS($reserva->getNumeroReservaPMS());
    }
    $terapeutaServicios = new TerapeutaServicios();
    $terapeuta = $terapeutaServicios->buscar($reserva->getIdTerapeuta());
    $reservaDTO->setTerapeuta($terapeuta);
    $reservaDTO->setTratamiento($reserva->getTratamiento());
    $reservaDTO->setHora($reserva->getHoraReserva());
    $reservaDTO->setEstado($reserva->getEstado());
    $reservaDTO->setComprobante($reserva->getComprobante());
    $reservaDTO->setObservaciones($reserva->getObservaciones());
    return $reservaDTO;
  }

  function deDTO(ReservaDTO $reservaDTO)
  {
    $reserva = new Reserva();
    $reserva->setId($reservaDTO->getId());
    if ($reservaDTO->getCliente() != "")
    {
      $cliente = new Cliente();
      $cliente->setId($reservaDTO->getIdCliente());
      $reserva->setCliente($cliente);
    } else
    {
      $repoPMS = new RepoPMS();
      $PMS = $repoPMS->buscarPorNumero($reservaDTO->getHabitacion());
      $reserva->setHabitacion($PMS->getHabitacion());
      $reserva->setNombreHuesped($PMS->getNombreHuesped());
      $reserva->setNumeroReservaPMS($PMS->getNumeroReservaPMS());
    }
    $reserva->setFechaReserva($reservaDTO->getFecha());
    $reserva->setGabinete($reservaDTO->getGabinete());
    $reserva->setTerapeuta($reservaDTO->getTerapeuta());
    $reserva->setTratamiento($reservaDTO->getTratamiento());
    $reserva->setHoraReserva($reservaDTO->getHora());
    $reserva->setEstado($reservaDTO->getEstado());
    $reserva->setObservaciones($reservaDTO->getObservaciones());
    return $reserva;
  }

}

?>
